# 自动加载的全局单例节点
# 该脚本在项目设置的autoload中注册，会在游戏启动时自动实例化
# 可用于存储全局状态、提供全局访问的工具函数等
#
# 继承自Node类，可以访问Node的所有属性和方法:
# 重要属性:
# - name: 节点名称
# - visible: 可见性
# - process_mode: 处理模式
#
# 重要方法:
# - add_child(): 添加子节点
# - remove_child(): 移除子节点
# - get_node(): 获取子节点
# - queue_free(): 延迟释放节点
# etc.
#
# 重要信号:
# - ready: 节点准备就绪时触发
# - tree_entered: 节点进入场景树时触发
# - tree_exiting: 节点退出场景树时触发
# etc.

# 预加载的加载场景
extends Node

@export var loading_scene = preload("res://scenes/loading_scene.tscn").instantiate()

# 存储当前加载的场景路径
var scenePath
# 加载进度更新信号，用于通知加载进度变化
signal Loading_Progress_Updater(percentage)

# 加载场景的方法
# 参数:
# - callerScene: 调用此方法的场景
# - path: 要加载的场景路径
func loadScene(callerScene, path) -> void:
	# 初始化全局状态或执行一次性设置
	scenePath = path
	get_tree().root.add_child(loading_scene)
	
	# 添加2秒延迟，确保加载界面有足够时间显示
	await get_tree().create_timer(2.0).timeout
	
	# 请求异步加载指定路径的资源
	ResourceLoader.load_threaded_request(scenePath)
	# 标记调用场景为待释放状态
	callerScene.queue_free()
	

# 每帧调用的方法，用于检查资源加载状态并处理场景切换
# 参数:
# - delta: 自上一帧以来经过的时间（秒）
func _process( _delta: float) -> void:
	# 每帧执行的逻辑，例如全局输入处理、状态更新等
	if scenePath != null :
		# 创建数组用于存储加载进度
		var progress = []
		# 获取资源加载状态和进度
		var loadStatus = ResourceLoader.load_threaded_get_status(scenePath, progress)
		
		# 如果资源已加载完成
		if loadStatus == ResourceLoader.THREAD_LOAD_LOADED :
			# 获取加载完成的场景并实例化
			var loaded_scene = ResourceLoader.load_threaded_get(scenePath).instantiate()
			# 移除加载界面
			get_tree().root.remove_child(loading_scene)
			
			# 添加新加载的场景到场景树
			get_tree().root.add_child(loaded_scene)
			# 清空场景路径，表示加载完成
			scenePath = null
			
		# 如果资源仍在加载中
		elif loadStatus == ResourceLoader.THREAD_LOAD_IN_PROGRESS :
			# 发出加载进度更新信号
			Loading_Progress_Updater.emit(progress[0])
